ホームに戻る
出典 :
関連 :
目次 :
VBAからのOracle DB接続(ODBC使用)
Oracle製ODBCドライバ(ここでは Instant Client 19.8)を使用してOracle DBに接続するためのサンプルコードを以下に記す。
ODBCの設定に関しては、
ODBCによるOracle DB接続
を参照のこと。
Sub Sample_ODBC_oracle()
Const DRIVER = "{Oracle in instantclient_19_8}" ' ドライバ名
Const IP = "100.50.53.129" ' 接続先のIPアドレス
Const PORT = "1521" ' ポート番号
Const NETSERVICENAME = "p2db" ' ネットサービス名
Const DSN = "PRIME2" ' データソース名 (tnsnames.ora で設定)
Const USERNAME = "p2dbown" ' ユーザー名
Const PASSWORD = "p2dbown" ' パスワード
' ---------------------------------------
' 接続文字列の構成
' (接続方法は以下のいずれかを選択する)
Dim strCon As String
#If 1 Then
' ドライバと接続先を直接指定する場合
strCon = "DRIVER=" & DRIVER
strCon = strCon & ";DBQ=" & "(DESCRIPTION = " & _
"(ADDRESS = (PROTOCOL = TCP)" & _
"(HOST = " & IP & ")" & _
"(PORT = " & PORT & "))" & _
"(CONNECT_DATA = (SERVICE_NAME = " & NETSERVICENAME & ")))"
#Else
' データソース名を指定する場合
' (事前に tnsnames.ora でのデータソース定義が必要)
strCon = "DSN=" & DSN
#End If
strCon = strCon & ";UID=" & USERNAME
strCon = strCon & ";PWD=" & PASSWORD
' ---------------------------------------
' 接続確立
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.ConnectionString = strCon
cn.Open
' ---------------------------------------
' SQL文構成
Dim strSQL As String
strSQL = "select * from table01 order by id desc"
' ---------------------------------------
' SQL文実行(データ取得)
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open strSQL, cn
' ---------------------------------------
' 取得したデータをワークシートに転記
Dim col As Long
Dim row As Long
With Worksheets("oracle_odbc")
.Cells.Clear
' フィールド名
For col = 0 To rs.Fields.Count - 1
.Cells(1, col + 1) = rs(col).Name
Next col
' レコード
Do Until rs.EOF
For col = 0 To rs.Fields.Count - 1
.Cells(row + 2, col + 1) = rs(col).Value
Next col
row = row + 1
rs.MoveNext
Loop
End With
rs.Close
cn.Close
Set cn = Nothing
End Sub
Recordset に読み込んだデータへのアクセス
Recordset (オブジェクト名を rs とする)のデータは、上記のようにフィールドのインデクス(0 起算)を指定するか、
またはフィールド名を直接指定することで取得できる。
データを読み込んだ直後は先頭のレコードを指しており、rs.MoveNext で次のレコードを指すようになる。
(繰り返すことで rs.EOF に到達するまで読み進めることができる)
rs.MoveFirst で先頭のレコードまで巻き戻すことも可能。
ここで、読み込んだデータが Null の場合、そのままユーザ定義型(Type)などに格納しようとするとエラーとなるため、
必要に応じて IsNull() プロシージャで Null かどうかを確認して対処する。
' インデクス(col)でフィールドを指定
' col : 0 ~ rs.Fields.Count - 1
tempVal = rs(col).Value
' フィールド名("Hoge")でフィールドを指定
tempVal = rs.Fields("Hoge").Value
' 取得した値が Null であれば 0 に置換する
If IsNull(tempVal) Then
Cells(1, 1).Value = 0
Else
Cells(1, 1).Value = tempVal
End If